/***************************************************
 @Name :        1196kk0
 @Time :        2025-05-26
 @Email :       2232506563@qq.com
 @Comment :     RTC实时时钟初始化及获取实时时间
 @FileName :    drv_RTC.c
 @Version :     4.0
****************************************************/

#include "drv_RTC.h"

/***************************************
函数名：RTC_Config
函数功能：RTC实时时钟初始化
输入参数：无
输出参数：无
其它：
        时钟源选择：LSE
        异步分频：  128
        同步分频：  256
        外部低速时钟频率：32.768kHz
****************************************/
void RTC_Config(void)
{
    RTC_InitTypeDef RTC_InitStruct;
    RTC_DateTypeDef RTC_DateStruct;
    RTC_TimeTypeDef RTC_TimeStruct;
    //使能PWR时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR , ENABLE);
    //使能备份区的读写
    PWR_BackupAccessCmd(ENABLE);
    //使能外部低速晶振LSE
    RCC_LSEConfig(RCC_LSE_ON);
    //等待LSE就绪
    while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
    //选择LSE作为RTC时钟源
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
    //使能RTC时钟
    RCC_RTCCLKCmd(ENABLE);
    //等待RTC寄存器同步
    RTC_WaitForSynchro();

    if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 30)
    {
        //配置RTC预分频器
        RTC_InitStruct.RTC_AsynchPrediv = 127;      //异步预分频    0x7F
        RTC_InitStruct.RTC_SynchPrediv = 255;       //同步预分频    0x00FF
        RTC_InitStruct.RTC_HourFormat = RTC_HourFormat_24;
        RTC_Init(&RTC_InitStruct);

        //使用RTC_SetDate设置日期
        RTC_DateStruct.RTC_Year = 25;
        RTC_DateStruct.RTC_Month = RTC_Month_September;
        RTC_DateStruct.RTC_Date = 1;
        RTC_DateStruct.RTC_WeekDay = RTC_Weekday_Monday;
        RTC_SetDate(RTC_Format_BIN , &RTC_DateStruct);

        //使用RTC_SetTime设置时间
        RTC_TimeStruct.RTC_Hours = 11;
        RTC_TimeStruct.RTC_Minutes = 14;
        RTC_TimeStruct.RTC_Seconds = 0;
        RTC_SetTime(RTC_Format_BIN , &RTC_TimeStruct);

        RTC_WriteBackupRegister(RTC_BKP_DR0 , 30);
    }
}

/********* 全局变量 *********/
RTC_DateTypeDef RTC_DateStr;    //实时日期
RTC_TimeTypeDef RTC_TimeStr;    //实时时间

/***************************************
函数名：Get_Cur_Time_Date
函数功能：获取实时时间
输入参数：无
输出参数：无
其它：
****************************************/
void Get_Cur_Time_Date(void)
{
    RTC_GetDate(RTC_Format_BIN , &RTC_DateStr);
    RTC_GetTime(RTC_Format_BIN , &RTC_TimeStr);
}








